Appearance
04. Tools、MCP与外部系统接入
版本:
v1.3最后更新:
2026-07-09
导读:把 Tool、MCP 和 Skill 分开看
如果你现在最想搞清楚的是三者的边界,建议先按下面顺序读:
本页继续保留总览,负责把 tools / MCP / connectors / skills / handoff / server tools 放在同一张工程地图里;上面三页分别负责把:
Tool讲成能力接口与执行边界MCP讲成协议层与接入边界Skill讲成任务封装与复用入口
0. 先用一张表把三者拆开
很多团队的问题不是没听过这三个词,而是三者总在一张图里互相代指。更实用的拆法通常是:
| 对象 | 一句话定义 | 它最该解决什么 | 典型 owner |
|---|---|---|---|
Tool | 一个最小可执行能力接口 | 参数、结果、副作用、审批、重试 | 业务系统 / 平台能力 owner |
MCP | 一层把能力标准化暴露出去的协议 | tools / resources / prompts 如何被发现、读取、调用 | 接入层 / 基础设施 owner |
Skill | 一个可复用任务能力包 | 指令、上下文、允许工具、执行策略、输出契约 | 应用团队 / 流程 owner |
如果你现在最困惑的是:
- “这个动作到底该怎么设计接口”,先看
Tool - “这些能力怎么标准化接出去”,先看
MCP - “某类任务怎么复用,不想只剩一段 prompt”,先看
Skill
0.1 用同一个事故分诊例子看,会更容易分清
假设你要做“线上事故分诊”:
Tool层会关心:read_recent_alerts、search_runbook、create_incident_ticket这几个动作分别怎么定义。MCP层会关心:这些动作、runbook 文档和值班模板如何按tools / resources / prompts暴露给不同宿主。Skill层会关心:事故分诊这个任务启动时要注入什么上下文、允许哪些工具、什么时候必须升级、输出格式是什么。
换句话说:
Tool关注“做什么”MCP关注“怎么接”Skill关注“怎么把这类任务稳定做完”
1. Agent 为什么离不开工具
没有工具的 Agent,通常只能:
- 说
- 猜
- 基于已有上下文组织答案
一旦你希望系统:
- 搜索实时信息
- 访问文件
- 查数据库
- 调业务 API
- 自动执行操作
你就一定会进入工具层设计。
Agent 的很多上限,最终都不是由“模型有多聪明”决定,而是由“工具接得好不好”决定。
2. Tool Use 的本质
工具调用的本质不是“模型执行代码”,而是:
- 模型输出一个结构化动作请求
- 应用或运行时真正去执行
- 执行结果回传给模型
这意味着:
- 模型负责决策
- 应用负责执行
这也是安全设计的基础。
3. 一个好工具应该长什么样
一个好工具通常具备这 6 个特征:
- 名字清楚
- 描述清楚
- 参数少而准
- 输入输出稳定
- 错误可理解
- 副作用边界清楚
好例子
search_web(query)get_ticket(ticket_id)list_project_files(path)
差例子
do_anything(data)process_request(input, mode, extra, flag)
差工具会让模型:
- 不知道什么时候该用
- 不知道参数怎么填
- 出错后难以恢复
4. 工具设计的关键原则
4.1 查询和写入分离
不要把读和写塞进一个工具。
更好的方式:
get_customer_info(customer_id)update_customer_info(customer_id, fields)
好处:
- 权限更清楚
- 审批更容易
- 审计更容易
4.2 高风险工具最小化
高风险工具包括:
- 发邮件
- 写数据库
- 提交工单
- 触发支付
- 操作生产环境
这类工具建议:
- 参数更严格
- 默认不可直接调用
- 必须审批
4.3 参数 schema 不要冗余
参数越多:
- 模型越容易填错
- 评测越麻烦
- 失败恢复越复杂
4.4 错误信息要可操作
不要只返回:
error
更好的错误应该说明:
- 为什么失败
- 哪个参数不合法
- 是否可重试
5. OpenAI 的工具能力应该怎么学
根据 OpenAI 官方文档在 2026-07-01 可访问的内容,建议按下面顺序学:
- Tools Guide
- Function Calling
- 具体工具类型
- Agents SDK 中的工具与运行时
重点关注:
- web search
- code execution / sandbox 使用场景
- tool search
- connectors / MCP
其中一个很重要的现实点是:
web search让模型访问最新信息tool search用于延迟加载大工具面
这两类能力对复杂 Agent 都很重要。
6. 先把工具类型分清楚,再谈怎么接
很多人一开始学工具,会把所有外部能力都混在一起说成“函数调用”。这会导致后面在执行位置、权限归属和成本评估上全部混乱。
更实用的分类方式通常是四类:
| 类型 | 谁来执行 | 适合什么场景 |
|---|---|---|
| 内建工具 | 平台或模型运行时 | web search、file search、computer use 这类平台能力 |
| function calling | 你的应用 | 你自己控制的业务 API、数据库查询、内部动作 |
| remote MCP | 远端 MCP server | 已经标准化暴露的外部服务或工具集合 |
| connectors | 平台维护的第三方接入层 | Dropbox、Google Workspace 等常见 SaaS |
根据 OpenAI Using tools 与 MCP and Connectors 文档在 2026-07-07 可访问的说明,Responses API 里可以组合 built-in tools、function calling、tool search 与 remote MCP,而 connectors 与 remote MCP 都通过 mcp 这一类工具形态接入。
这个区分非常重要,因为它决定了几个关键问题:
- 工具真正在哪执行。
- 出问题时谁负责兜底。
- 审批和日志该落在哪一层。
- 机密信息到底暴露给了谁。
6.1 built-in tools、local shell、hosted shell 和 code interpreter 不是一回事
OpenAI 当前官方工具文档已经把这几类能力拆得很明确:
built-in tools:平台直接提供的能力,例如 web search、file search、computer use。shell:让模型通过终端环境执行命令,既可以是本地执行,也可以是 OpenAI 托管执行。code interpreter:更偏受控 Python 沙箱,适合数据分析、计算、脚本化处理。
这几类能力不要混成一个概念,因为它们回答的是不同问题:
- 你到底要的是“访问外部信息”
- 还是“跑命令和脚本”
- 还是“在受限 Python 环境里做计算”
更实用的判断通常是:
- 要查实时网页、查文件、点界面:先看 built-in tools。
- 要 build-test-run、跑系统命令、读写项目文件:先看 shell / local shell。
- 要做表格分析、数值处理、快速 Python 计算:先看 code interpreter。
6.2 tool search 解决的是“大工具面加载成本”,不是权限问题
OpenAI 当前 Using tools 和 Tool search 文档都已经明确说明:
tool_search允许模型按需搜索并加载 deferred tool definitions- 只有
gpt-5.4及以后模型支持
这件事的工程意义很大,因为很多 Agent 一接企业工具就会遇到:
- 工具定义太多
- 每轮都把全部 schema 塞进上下文
- token 成本和延迟同时上升
tool search 更像是在解决:
- 工具面过大时的上下文装配问题
但它并不替你自动解决:
- 哪些工具该暴露
- 哪些工具有权限
- 哪些工具需要审批
所以正确心智通常是:
tool search负责按需加载allowed_tools / policy / approval负责暴露边界
6.3 MCP、Skill、Tool 最好按“三层模型”理解
很多团队一提 Agent 接入层,就会一句话把 MCP、skill、tool 全部堆在一起说成“我们接了很多能力”。这会让讨论很快失焦,因为你其实可能在混着说三件完全不同的事:
- 具体能执行什么动作
- 这些动作按什么协议暴露出来
- 在什么场景下把这些动作组织成可复用工作单元
更稳的理解方式通常是下面这三层:
| 层级 | 它回答的问题 | 核心对象 | 典型产物 |
|---|---|---|---|
Tool | 系统到底能执行什么动作 | 单个能力接口 | name、description、schema、side effects |
MCP | 这些能力如何被标准化暴露和连接 | client-server protocol | server、tools、resources、prompts、auth |
Skill | 针对某类任务,怎么把能力组织成一个可复用单元 | orchestration package | instructions、allowed tools、context、policy、eval checklist |
根据 MCP 官方 architecture 在 2026-07-09 可访问的内容,MCP 规范里明确强调的是 tools、resources、prompts 等协议原语;它并没有把 skill 定义成协议级对象。也就是说:
tool是最小执行单元MCP是把 tool/resource/prompt 暴露出去的协议层skill更像应用层或平台层的场景化封装
这件事必须说清,因为它直接影响你的系统分层:
tool设计错了,模型不会稳定调用MCP边界画错了,跨系统授权和信任关系会混乱skill封装错了,团队会把场景经验散落在 prompt、代码和文档各处
6.4 Skill 不是 MCP 原语,也不等于“一段 prompt”
很多人第一次做 skill,会犯两个很常见的错误:
- 把 skill 写成一段系统提示词
- 把 MCP 的
prompts直接等同于 skill
这两种理解都不够完整。
更稳的工程定义通常是:
skill = instructions + context template + allowed tools + execution policy + output contract
拆开看会更清楚:
instructions说明这个 skill 什么时候该用、目标是什么context template说明启动时应注入哪些上下文、约束和参考材料allowed tools决定这个 skill 能看到多大的工具面execution policy决定是否允许写操作、是否需要 approval、是否能并行output contract决定返回摘要、产物对象和日志字段长什么样
如果只剩一段 prompt,通常还不够称为 skill;如果只暴露了一组 tools,也还没有形成 skill。
从协议视角看,MCP 里的 prompts 更像 server 暴露给客户端复用的提示模板或交互入口,而不是完整的业务技能包。这里的 skill 更接近一种工程抽象,很多平台也会把类似概念叫做:
- playbook
- capability pack
- task template
- workflow preset
换句话说,skill 不是行业里唯一统一命名的正式标准,但它非常适合拿来承接“场景经验复用”这一层。
6.5 一个最容易落地的对应关系
如果你还是容易混,最简单的记法可以是:
Tool是“刀”MCP是“刀柄接口和插座标准”Skill是“什么时候用哪把刀、按什么顺序做、出了事怎么收口”
拿一个“生产事故分诊”场景举例会更直观:
| 层级 | 在事故分诊场景里是什么 |
|---|---|
Tool | search_runbook、read_recent_alerts、create_incident_ticket |
MCP | 把告警系统、知识库、工单系统按标准协议暴露成 tools/resources/prompts |
Skill | “事故分诊 Skill”,内部规定先查告警、再读 runbook、最后决定是否升级和建单 |
这三层的 owner 往往也不同:
tool往往由业务系统或平台工程同学维护MCP server往往由接入层或基础设施同学维护skill往往由最懂场景的应用团队、流程 owner 或 AI 产品团队维护
如果 owner 不分,最后就很容易变成:
- 工具定义写在业务代码里
- 场景规则写在 prompt 里
- 权限策略写在前端开关里
这样系统短期能跑,长期一定难维护。
6.6 项目和面试里最好这样讲,而不是一句“我们做了 MCP”
最容易失分的说法通常是:
- “我们接了 MCP,也做了几个 skill,还挂了很多 tool。”
因为这句话没有告诉别人:
- 你到底标准化了什么
- 你到底封装了什么
- 你到底治理了什么
更好的讲法通常是:
- 先说
tool:我们把哪些动作做成了稳定可调用的最小能力单元。 - 再说
MCP:我们怎么把这些能力按统一协议暴露给 Agent,并处理认证、审批和最小暴露范围。 - 最后说
skill:我们怎么把场景经验封成可复用入口,让不同任务只看到自己该看的工具和约束。
例如你可以这样讲:
- 我们先把 Jira、知识库检索、告警查询拆成独立 tool。
- 然后通过 MCP 暴露成统一接入层,顺手把 OAuth、审批和 allowed tools 一并收进协议边界。
- 最后按“事故分诊”“变更巡检”“交付物生成”封成不同 skill,每个 skill 只拿到完成本任务所需的最小工具面。
这样别人一听就能分出来:
- 你不是只会接工具
- 你也不是只会写 prompt
- 你是在做能力分层、暴露治理和场景封装
这才是成熟 Agent 工程最有价值的部分。
7. Tool Use 的执行边界一定要画清楚
根据 Anthropic Tool use 官方文档在 2026-07-07 可访问的说明,Claude 的工具也分成 client tools 和 server tools:
- client tools 由你的应用执行
- server tools 由 Anthropic 基础设施执行
这和 OpenAI 体系里的 built-in tools、function tools、MCP/connectors 很像,核心都在强调一件事:
- 模型只负责提出动作请求,不该被误解成“模型自己在执行外部系统动作”
这个边界如果不画清楚,团队很容易在下面几件事上犯错:
- 误把模型能力当成权限能力
- 误把平台可调用当成业务已授权
- 误把工具失败当成模型推理失败
所以做架构图时,最好明确画出:
- model decision layer
- tool execution layer
- approval / policy layer
- audit / observability layer
8. MCP 为什么值得重点学
根据 MCP 官方介绍在 2026-07-01 的可访问内容:
- MCP 是一个开放标准,用于把 AI 应用连接到外部系统
- 一个常见比喻是“AI 的 USB-C 接口”
这对学习 Agent 很重要,因为它提供了一个统一思维模型:
- 不同能力都能按统一协议暴露给 Agent
这会让你的系统:
- 更标准化
- 更可复用
- 更容易连接多种数据源与工具
9. MCP 的核心组成
从学习视角,你至少应该理解:
servertoolsresourcesprompts
tools
代表可执行能力。
例如:
- 搜索
- 计算
- 查询数据库
resources
代表可读取内容。
例如:
- 文件
- 文档
- 表结构
- 配置
prompts
代表预定义的提示或交互入口。
9.1 resources 和 tools 不要混成一个能力类型
MCP 官方介绍和架构文档反复强调的一点是:
- tools 是“可执行能力”
- resources 是“可读取上下文”
- prompts 是“预定义交互入口”
这不是文档分类游戏,而是系统边界。
如果把 resources 也当成 tools 去用,常见问题是:
- 为了读一段资料也要走执行链路
- 审批、审计和超时策略全部混乱
- 原本只读的内容被误建模成有副作用的动作
更稳的建模方式通常是:
- 读表结构、读配置、读文档:优先 resources
- 真正会产生动作、副作用或远端调用:才建成 tools
9.2 remote MCP 的授权流程本身就是设计重点
MCP 官方授权文档和连接远端 server 的文档已经把这件事说得很清楚:
- 很多 remote MCP server 需要认证
- 常见方式包括 OAuth、API key 或账号密码
- MCP 官方安全材料明确推荐用 OAuth 2.1 保护敏感资源和操作
这意味着 remote MCP 接入时,不该只问“协议通不通”,还要问:
- token 是谁发的
- token 能访问哪些租户 / 资源
- 过期和撤销怎么处理
- 一个 server 被多个 agent / 宿主复用时,凭据边界怎么隔离
如果这层没设计清楚,后面最容易出的问题不是模型选错工具,而是:
- 本来不该看的租户数据被看到了
- 一次授权拿到了过宽能力
- tool result 里混进了别的工作区或别的用户上下文
10. 什么时候该用 MCP,而不是自己手写一堆工具
满足这些条件时,MCP 的价值会更明显:
- 工具种类很多
- 未来会接入多个宿主或多个 Agent 系统
- 希望能力标准化复用
- 有企业内部服务要统一暴露
- 想把“数据读取”和“能力执行”抽象成统一接口
如果只是一个非常小的单体项目,直接本地工具定义通常也完全没问题。
11. 从 OpenAI 文档看 MCP 的现实意义
根据 OpenAI MCP and Connectors 指南在 2026-07-01 可访问的说明:
- OpenAI 平台已经把 MCP 工具接入作为一类正式能力来支持
- 文档里也强调了如何过滤可用工具,以及如何处理工具审批
这说明:
- MCP 已经不只是“社区概念”
- 它正在成为 Agent 接外部世界的重要标准层
12. 工具面太大时,要主动收缩暴露范围
根据 OpenAI MCP and Connectors 文档在 2026-07-07 可访问的说明,很多 MCP server 会暴露几十个工具;如果全部暴露给模型,成本、延迟和误调用概率都会上升。官方文档明确给出了 allowed_tools 这种收缩手段,并且允许通过 require_approval 控制审批。
这背后的工程原则其实很朴素:
- 不是“能连上多少工具”就暴露多少工具
- 而是“当前任务真正需要什么”才暴露什么
建议至少做三层约束:
- 产品层约束:这个页面或场景是否真的需要某类工具。
- 运行时约束:本次会话只加载必要工具。
- 单工具约束:对高风险能力再做审批和参数白名单。
这会直接改善三件事:
- 模型更容易选对工具
- token 成本和回合数更可控
- 风险面不会因为“方便”而无限膨胀
12.1 工具选择策略最好显式建模,而不是完全放任模型自由发挥
OpenAI 当前 Using tools、Function calling 文档都在强调:
- tool calling 是一个多步协议
- 模型会基于你暴露的工具面做选择
工程上更稳的做法通常不是“永远让模型自由决定”,而是给出明确策略:
- 这一步必须先查事实,再决定是否调用写工具
- 这一步禁止调用外部写工具
- 这一步最多允许调用某几类只读工具
- 这一步如果没有足够证据,就不允许继续执行
换句话说,真正成熟的系统通常会同时控制:
tool surfacetool choicemax iterationsapproval boundary
12.2 工具收缩最好跟页面、任务、租户和风险级别一起做
很多系统只按“当前会话”收工具,其实还不够。
更像生产系统的收缩方式通常至少有四个维度:
- 页面 / 入口维度:这个产品入口本来就不该看到某些高危工具
- 任务维度:本次任务只开放需要的能力
- 租户维度:不同租户能看到的企业工具面不同
- 风险维度:高风险动作即使可见,也不能无审批直通
如果没有这几层,常见结果就是:
- 某个低风险页面意外拿到了高风险工具面
- 工具太多导致模型误选
- 同一个 agent 在不同租户下权限表现不一致,却没人解释得清楚
12.3 最好显式维护一层 capability registry,而不是把工具清单散在代码里
很多团队前期工具不多时,会直接把工具定义散在各个模块里。
但工具一旦变多,真正先失控的往往不是模型,而是:
- 谁知道有哪些工具
- 哪些工具属于哪个业务域
- 哪些工具已经废弃
- 哪些工具需要审批或更高权限
更像生产系统的做法通常会维护一层 capability registry,至少能回答:
tool_idownerrisk_levelallowed_tenantsrequired_auth_scopeapproval_policyartifact_output_typeversiondeprecation_state
这层 registry 的价值非常大,因为它会直接决定:
- tool search 能搜到什么
- Router / manager 能调起什么
- 评测系统要覆盖哪些高风险工具
- 发布和回滚时到底影响了哪一组能力
13. approval 不是锦上添花,而是高风险工具的必需层
很多团队会在 Demo 跑通后才想审批,但一旦工具能:
- 发消息
- 改权限
- 写数据库
- 删资源
- 操作生产环境
审批就不应该再被当成可选项。
根据 OpenAI MCP and Connectors 文档在 2026-07-07 可访问的说明,远端 MCP 与 connector 工具可以配置 require_approval,并支持审批请求与审批响应的回合式交互。这说明审批不只是产品层弹窗,它本身就是工具协议的一部分。
落到系统设计里,至少要保留这些对象:
| 字段 | 作用 |
|---|---|
approval_request_id | 审批动作的稳定标识 |
tool_name | 当前待放行的具体工具 |
tool_arguments_snapshot | 审批时看到的参数快照 |
risk_level | 高、中、低风险分级 |
approved_by | 谁做的决策 |
decision_reason | 放行、拒绝或修改原因 |
否则事后很难回答:
- 这次写操作到底是谁批的
- 审批时和最终执行时参数是否一致
13.1 审批之后最好把执行参数再绑定一次
真正危险的场景通常不是“有没有审批”,而是:
- 审批通过的是一组参数
- 最终执行时跑的是另一组参数
所以更稳的做法通常会多存几类字段:
approved_arguments_hashapproved_scopeexpires_atexecution_idempotency_key
这样你才能回答:
- 这次执行是不是仍然在批准范围内
- 审批是否已经过期
- 失败重试时会不会重复制造副作用
13.2 授权范围最好和工具面同时收缩,而不是只靠“是否登录”
很多系统会默认:
- 只要用户登录了
- agent 就可以代表用户调一批工具
这远远不够。
更稳的做法通常至少要同时问三件事:
用户本人是否有这个权限当前 agent / workflow是否被允许代执行当前场景是否满足最小必要范围
也就是说,授权判断最好至少包含:
- user scope
- agent scope
- task scope
如果没有这三层,常见风险会是:
- 用户本来能看数据,但 agent 不该自动导出
- 用户本来有改单权限,但某个 FAQ 场景根本不该暴露写工具
- 同一个租户下的低风险助手意外继承了高风险工具面
14. 远端 MCP 最大的风险,不是“调不通”,而是信任边界错了
OpenAI 官方文档对 remote MCP 有一句非常值得认真对待的提醒:
- 开发者必须信任自己接入的 remote MCP server,因为恶意 server 可能从进入模型上下文的内容里窃取敏感信息
这句话的工程含义很重。它说明远端 MCP 的首要问题不是协议兼容,而是:
- 这个 server 到底是谁维护的
- 它能看到什么
- 它会把什么再回传给模型
因此接入远端 MCP 时,建议把下面这些问题当成上线前检查项:
- server 是否可信、是否可审计。
- 是否会接触密钥、PII、生产数据。
- 工具返回结果里是否可能带 prompt injection 或诱导内容。
- 是否为不同租户做了隔离。
- 是否能做最小权限 OAuth 授权。
如果这些问题答不清,协议再标准,接入也依然不安全。
14.1 tool result 也要当不可信输入处理
不管是 remote MCP、第三方 connector,还是内部工具,返回结果都不该被默认当成“绝对可信的自然语言上下文”。
因为现实里它可能包含:
- 诱导模型执行下一步的文本
- 混入的 prompt injection
- 超长无关日志
- 租户错位的信息
更稳的处理方式通常是:
- 先做结构化校验。
- 再做字段级截断、清洗和白名单提取。
- 只把当前决策真正需要的字段回送给模型。
- 原始结果保存在审计或调试层,不直接整包注入上下文。
否则系统很容易进入一种危险状态:
- 工具调用本来是为了提高确定性
- 结果却通过未净化返回把新的不确定性重新注入模型
14.2 remote MCP 和 connectors 最容易漏掉的是令牌与租户边界
远端接入一旦走 OAuth、API key 或 SaaS connector,真正危险的通常不是“技术接通”,而是:
- 谁在代表谁访问
- 访问结果是不是跨了租户
- token 续期和撤销后旧会话还会不会继续用
更稳的设计通常至少要有这些字段或概念:
connection_idtenant_idauthorized_scopesconnected_account_idexpires_atrevoked_atconsent_source
这样后面你才能真正回答:
- 这个结果到底来自哪个外部身份
- 为什么这个租户能看到这份数据
- 某次授权撤销后,历史 session 是否还应继续使用旧连接
15. 企业内部工具接入的一个推荐顺序
建议按以下顺序做:
- 先做只读工具
- 再做低风险写入工具
- 最后才做高风险执行工具
并且始终分层:
- 数据读取层
- 业务逻辑层
- Agent 调用层
这样你未来更容易:
- 做权限控制
- 做审批
- 做审计
- 替换底层系统
15.1 shell / computer use / browser automation 更像独立执行层,不只是多一个工具
OpenAI 当前 Shell、Local shell、Computer use 文档都在反复强调一件事:
- 这类能力不是简单的“查一个 API”
- 它们会进入终端、文件系统、UI 环境或持续执行循环
这意味着当你接入:
- shell
- local shell
- code interpreter
- computer use
时,真正要设计的不只是 schema,而是:
- 工作区生命周期
- 端口 / 文件暴露范围
- 可恢复执行记录
- 输出产物保存
- 失败后的清理和补偿
如果把它们只当“普通工具”,后面几乎一定会在恢复、权限和审计上出问题。
15.2 异步工具和长作业最好按“提交 - 轮询 - 回收产物”三段式建模
很多企业工具不会立刻返回最终结果,例如:
- 导出报表
- 跑批量分析
- 触发长时脚本
- 发起代码扫描或部署检查
如果把这类动作强行当成同步 tool call,常见后果就是:
- 超时
- 重试语义混乱
- 模型不知道结果什么时候可用
更稳的契约通常会拆成三段:
submit_jobget_job_statusfetch_job_artifact
这样好处很直接:
- 模型和工作流能分清“已提交”和“已完成”
- 审批、回放和恢复更容易定位到哪一段
- 产物可以单独进入 artifact 层,而不是直接塞回工具返回文本
16. handoff、tools-as-agents 和 MCP server,什么时候该选哪一个
很多团队一旦开始拆 Agent,就会把三件事混在一起:
- handoff
- 把另一个 agent 当工具
- 直接接 MCP server
更实用的判断方式通常是:
16.1 handoff 适合什么
更适合:
- 用户意图已经明显切换
- 需要换一个 specialist 持续接管后续回合
- 新 agent 需要自己的上下文、策略和边界
OpenAI 当前 Orchestration and handoffs 的主线就是把 handoff 当作“控制权迁移”。
16.2 tools-as-agents 适合什么
更适合:
- 当前 agent 只是临时调用一个受控子能力
- 子能力需要独立推理,但不需要长期接管对话
- 你希望保留统一的上层控制和停止条件
这更像:
agent 调 agent,但外层仍然把它当一个受控工具
16.3 MCP server 适合什么
更适合:
- 你已经有一批稳定的企业能力需要标准化暴露
- 不同宿主、不同 agent 系统都可能复用这层能力
- 你想把工具、资源、提示入口统一成协议层
如果只是一个很小的单体应用,把本地工具写清楚往往更直接。
16.4 一个简单判断法
可以先问自己四个问题:
- 这是能力调用,还是控制权迁移。
- 这是单次子任务,还是后续多轮都要由另一个 specialist 接管。
- 这是本项目私有接口,还是未来要被多宿主复用的标准能力。
- 这一步失败后,谁负责回退、补偿和对外解释。
17. 工具契约除了 schema,还要覆盖错误语义
很多工具文档只写输入参数和返回字段,但在真实 Agent 系统里,错误语义同样重要。
如果工具只会返回一个模糊的 error,模型和工作流层就很难判断:
- 这是参数错误
- 还是权限不足
- 还是远端暂时超时
- 还是副作用已经成功,只是回包丢了
更可执行的返回契约,至少应该考虑这些维度:
| 字段 | 作用 |
|---|---|
retryable | 是否建议自动重试 |
side_effect_confirmed | 外部副作用是否已确认落地 |
recommended_next_action | 建议续跑、重试、补偿还是转人工 |
error_scope | 参数层、权限层、外部系统层或业务层 |
external_reference | 远端对象或请求 ID |
这样工作流恢复、人工接管和评测系统才有机会做对分流。
17.1 幂等性和执行记录最好进入工具契约
很多外部动作真正难的不是“能不能调”,而是:
- 超时之后到底有没有成功
- 重试时会不会重复发消息、重复扣款、重复建单
所以高风险工具最好显式补一层执行记录,例如:
| 字段 | 作用 |
|---|---|
execution_id | 单次执行的稳定标识 |
idempotency_key | 防止重复副作用 |
attempt | 第几次尝试 |
side_effect_state | 未执行、已执行、未知、需确认 |
compensation_hint | 失败后建议补偿路径 |
这样恢复系统和人工接管台才能分清:
- 是可以直接自动重试
- 还是必须先确认外部世界到底发生了什么
17.2 tool output 最好先标准化,再回送模型
除了错误语义,正常结果也最好先做标准化。
更稳的路径通常是:
- 工具返回原始结构
- 应用层做 normalize / redact / summarize
- 模型消费的是稳定的二次结构
这会直接改善:
- 跨工具的一致性
- 回归测试稳定性
- 多模型切换时的兼容性
17.3 工具返回的“产物对象”最好和“模型可见摘要”分开
很多工具真正重要的结果并不是一小段文本,而是:
- 一个导出的文件
- 一个生成的表格
- 一个网页快照
- 一个工单对象
- 一个 deployment / run record
这类结果更适合拆成两层:
artifactmodel-facing summary
也就是:
- 系统保存完整产物对象及其 ID
- 模型只消费下一步决策真正需要的摘要、状态和引用
更像生产系统的 artifact 字段通常至少包括:
artifact_idartifact_typesource_toolcreated_atvisibility_scoperetention_policytrace_id
这样后面你才更容易做:
- 回放
- 审计
- 人工接管
- 产物清理与保留策略
18. 工具接入后的观测和评测不能缺席
工具接得越多,系统越容易出现一种错觉:
- 问题看起来像模型不够聪明
- 其实是工具设计、权限控制或执行质量出了问题
所以建议至少单独监控这些指标:
tool_selection_accuracytool_argument_error_ratetool_timeout_rateapproval_rateapproval_reject_rateduplicate_side_effect_rateper_tool_latency
如果有 Agent 评测体系,还应该把这些维度纳入回归:
- 是否选对工具
- 是否用对参数
- 是否在不需要工具时过度调用
- 是否把高风险动作正确升级到审批
18.1 工具接入最好单独补 contract test,而不是只靠端到端用例
很多团队接一个工具后,只有:
- “让 agent 跑一下看看”
这对真实系统远远不够。
更稳的做法通常至少会补三层验证:
schema / contract testpermission / approval testend-to-end trace test
这三层各自解决不同问题:
- contract test 看参数和返回结构有没有漂移
- permission test 看不该暴露的工具会不会漏出来
- end-to-end trace test 看 loop、审批和恢复是否真的串起来
如果只做最后一层,你很容易把工具契约问题误判成模型问题。
否则工具层的问题会被混在“模型效果不好”里,团队很难真正优化。
19. 工具接入时最常见的 8 个坑
- 工具定义太宽泛
- 参数过多过杂
- 错误信息不可读
- 读写没有分离
- 没有审批和日志
- 把 remote MCP / connector 返回结果原样整包喂回模型
- shell / computer use 接进来后,没有把工作区当独立执行层治理
- 只有 schema,没有 idempotency、execution record 和补偿语义
只要踩中其中两个,Agent 的稳定性通常就会明显下降。
20. 重点官方资源
以下资源已按 2026-07-09 复核到当前正式入口;其中部分 OpenAI 页面对脚本访问会返回 403,但浏览器入口仍可正常打开:
- OpenAI Using tools:https://developers.openai.com/api/docs/guides/tools
- OpenAI Function calling:https://developers.openai.com/api/docs/guides/function-calling
- OpenAI Tool search:https://developers.openai.com/api/docs/guides/tools-tool-search
- OpenAI MCP and Connectors:https://developers.openai.com/api/docs/guides/tools-connectors-mcp
- OpenAI Shell:https://developers.openai.com/api/docs/guides/tools-shell
- OpenAI Local shell:https://developers.openai.com/api/docs/guides/tools-local-shell
- OpenAI Code Interpreter:https://developers.openai.com/api/docs/guides/tools-code-interpreter
- OpenAI Computer use:https://developers.openai.com/api/docs/guides/tools-computer-use
- OpenAI Realtime with tools / MCP:https://developers.openai.com/api/docs/guides/realtime-mcp
- OpenAI Agents SDK:https://developers.openai.com/api/docs/guides/agents
- Anthropic Tool use with Claude:https://docs.anthropic.com/en/docs/build-with-claude/tool-use/overview
- MCP 官方简介:https://modelcontextprotocol.io/docs/getting-started/intro
- MCP Architecture overview:https://modelcontextprotocol.io/docs/learn/architecture
- MCP Authorization:https://modelcontextprotocol.io/docs/tutorials/security/authorization
- MCP Security best practices:https://modelcontextprotocol.io/docs/tutorials/security/security_best_practices
- MCP Connect to remote servers:https://modelcontextprotocol.io/docs/develop/connect-remote-servers
21. 本章后的练习建议
建议你至少做 6 个练习:
- 设计一个搜索工具 schema
- 设计一个企业工单查询工具 schema
- 设计一组“读写分离”的客户信息工具
- 为一个 remote MCP server 设计最小暴露工具面和 OAuth 授权边界
- 为一个带副作用的写工具设计
approval + idempotency + execution record契约 - 以“事故分诊”为题,分别写出 tool 清单、MCP 暴露边界和 skill 契约,强迫自己把三层彻底拆开
完成标准不是“能调用”,而是你能回答:
- 这个工具为什么这样设计?
- 哪些参数是必须的?
- 哪些风险被隔离掉了?